﻿// E. Binary Inversions.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1760/E

给你一个长度为 n 的二进制数组†，你最多可以对它进行一次操作。在操作中，你可以选择任意一个元素进行翻转：将 0 变为 1，反之亦然。

在进行最多一次操作后，数组的最大反转数‡ 是多少？
二进制数组是只包含 0 和 1 的数组。数组中的反转数是指指数 i,j 中 i<j 且 ai>aj 的数量对。

输入
输入由多个测试用例组成。第一行包含一个整数 t（1≤t≤104）--测试用例数。测试用例说明如下。
每个测试用例的第一行包含一个整数 n（1≤n≤2⋅105）--数组的长度。

下面一行包含 n 个空格分隔的正整数 a1
, a2,..., an (0≤ai≤1) - 数组的元素。

保证所有测试用例的 n 之和不超过 2⋅105。

输出
对于每个测试用例，输出一个整数 - 数组在执行最多一次操作后的最大反转数。

InputCopy
5
4
1 0 1 0
6
0 1 0 0 1 0
2
0 0
8
1 0 1 1 0 0 0 1
3
1 1 1
OutputCopy
3
7
1
13
2


注释
在第一个测试案例中，最初的反转是由一对指数（1,2）、（1,4）、（3,4）组成的，总共 3 个，这已经是最大值了。

对于第二个测试案例，最初的反转是由一对索引 (2,3)、(2,4)、(2,6)、(5,6) 组成的，总共有 4 个。但是，通过翻转第一个元素，数组变为 1,1,0,0,1,0，
其中的反转由 (1,3)、(1,4)、(1,6)、(2,3)、(2,4)、(2,6)、(5,6) 这几对索引形成，总共有 7 个反转，这是可能的最大值。
*/


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 200010;
int a[N];
int pre[N];
int T, n;

void solve() {
	cin >> n;
	memset(pre, 0, sizeof pre);
	memset(a, 0, sizeof a);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		pre[i] = pre[i - 1] + a[i];
	}
	long long total = 0;
	//计算所有翻转;
	for (int i = 1; i <= n; i++) {
		if (a[i] == 0) {
			total += pre[i];
		}
	}
	long long add = 0;
	for (int i = 1; i <= n; i++) {
		if (a[i] == 1) {
			int len = n - i;
			//变成0 的影响   后面的0贡献要减去 然后前面的1都加上了1的贡献
			long long curr = -(len - (pre[n] - pre[i])) + (pre[i-1]);
			add = max(add, curr);
		}
		else {
			int len = n - i;
			//变成1的影响 后面的0都要就加贡献  前面的1 要减去贡献
			long long curr = -pre[i - 1] + (len - (pre[n] - pre[i]));
			add = max(add, curr);
		}
	}

	cout << total + add << endl;


	return;
}


int main()
{
	cin >> T;
	while (T--) {
		solve();
	}


	return 0;
}

